
/**
 * @desc 封装函数防抖操作的方法
 * @param {@} func 
 * @param {*} wait 
 * @param {*} immediate 
 */
export function debounce(func,wait,immediate){
    //初始化一些参数，用于保存一些内容
    var timeout,timestamp,args,context,result;
    
    const delay = function(){
        console.log("延迟执行逻辑");
        //调用的时候时间差，当前时间-上次执行时间
        let last = +new Date() - timestamp;

        if(last<wait && last>0){
            timeout = setTimeout(delay,wait - last);
        }else{
            console.log("超过设置时间");
            timeout = null;
            //超过设置时间的方位了，执行方法操作
            if(!immediate){
                result = func.apply(context,args);
                context = args = null;
            }
        }
    }

    return function(...args){
        context = this;//时间对象
        timestamp = +new Date();//时间对象，当前操作时间，进行记录
        let callNow = immediate && !timeout;//立即执行并且，超过定时器设置时间
        console.log(callNow,"是否现在调用",timeout)

        //如果当前定时器还未结束状态，那么重新设置过期状态触发
        if(!timeout) timeout = setTimeout(delay,wait);
        console.log("时间戳",timeout);

        if(callNow){
            console.log("现在执行")
            result = func.apply(context,args);
            context = args = null;
        }

        return result;
    }
}